home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 11 - 1995 / 11.02 Feb 95 / 11.02 Challenge / SolveTopCorners.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-10  |  10.7 KB  |  359 lines  |  [TEXT/KAHL]

  1. /*
  2.  
  3.     SolveRubiksCube
  4.     Copyright (c) 1994  J Robert Boonstra
  5.         
  6. */
  7.  
  8. #pragma options(honor_register,assign_registers)
  9.  
  10. #include "rubik.h"
  11. #include "transform.h"
  12.  
  13. Boolean SolveTopCorners(register RubiksCube *rub)
  14. {
  15. short loopCount;
  16.  
  17. /**********************************************************
  18.  * 
  19.  * STEP 2:  Put the corner cubes in the top layer into  
  20.  *          the proper position and orientation.  
  21.  *          Loop until all are correct.
  22.  *
  23.  *********************************************************/
  24.   loopCount=0;
  25.   do {
  26.     if (++loopCount>8) return false;
  27.     if (DRF_F == U) {
  28.       if (DRF_R == F) {
  29.         if (DRF_D == R) {        goto URF1; 
  30.         } else if (DRF_D == L) { D3; goto ULF1; 
  31.         }
  32.       } else if (DRF_R == R) {
  33.         if (DRF_D == F) {        goto URF1; 
  34.         } else if (DRF_D == B) { D1; goto URB1; 
  35.         }
  36.       } else if (DRF_R == B) {
  37.         if (DRF_D == R) {        D1; goto URB1;
  38.         } else if (DRF_D == L) { D2; goto ULB1;
  39.         }
  40.       } else if (DRF_R == L) {
  41.         if (DRF_D == F) {        D3; goto ULF1;
  42.         } else if (DRF_D == B) { D2; goto ULB1;
  43.         }
  44.       }
  45.     } else if (DRF_R == U) {
  46.       if (DRF_F == F) {
  47.         if (DRF_D == R) {        goto URF1; 
  48.         } else if (DRF_D == L) { D3; goto ULF1; 
  49.         }
  50.       } else if (DRF_F == R) {
  51.         if (DRF_D == F) {        goto URF1; 
  52.         } else if (DRF_D == B) { D1; goto URB1; 
  53.         }
  54.       } else if (DRF_F == B) {
  55.         if (DRF_D == R) {        D1; goto URB1;
  56.         } else if (DRF_D == L) { D2; goto ULB1;
  57.         }
  58.       } else if (DRF_F == L) {
  59.         if (DRF_D == F) {        D3; goto ULF1;
  60.         } else if (DRF_D == B) { D2; goto ULB1;
  61.         }
  62.       }
  63.     } else if (DRF_D == U) {
  64.       if (DRF_F == F) {
  65.         if (DRF_R == R) {        goto URF1; 
  66.         } else if (DRF_R == L) { D3; goto ULF1; 
  67.         }
  68.       } else if (DRF_F == R) {
  69.         if (DRF_R == F) {        goto URF1; 
  70.         } else if (DRF_R == B) { D1; goto URB1; 
  71.         }
  72.       } else if (DRF_F == B) {
  73.         if (DRF_R == R) {        D1; goto URB1;
  74.         } else if (DRF_R == L) { D2; goto ULB1;
  75.         }
  76.       } else if (DRF_F == L) {
  77.         if (DRF_R == F) {        D3; goto ULF1;
  78.         } else if (DRF_R == B) { D2; goto ULB1;
  79.         }
  80.       }
  81.     }
  82.     goto corner2;
  83. URF1: if (DRF_F == U)        { F1D1F3;
  84.       } else if (DRF_R == U) { R3D3R1;
  85.       } else if (DRF_D == U) { R3D1R1D2R3D3R1;
  86.       } 
  87.       goto corner2;
  88. URB1: if (DRB_R == U)        { R1D1R3;
  89.       } else if (DRB_B == U) { B3D3B1;
  90.       } else if (DRB_D == U) { B3D1B1D2B3D3B1;
  91.       } 
  92.       goto corner2;
  93. ULB1: if (DLB_B == U)        { B1D1B3;
  94.       } else if (DLB_L == U) { L3D3L1;
  95.       } else if (DLB_D == U) { L3D1L1D2L3D3L1;
  96.       }
  97.       goto corner2;
  98. ULF1: if (DLF_L == U)        { L1D1L3;
  99.       } else if (DLF_F == U) { F3D3F1;
  100.       } else if (DLF_D == U) { F3D1F1D2F3D3F1;
  101.       } 
  102. corner2: ;
  103.  
  104.     if (DRB_R == U) {
  105.       if (DRB_B == F) {
  106.         if (DRB_D == R) {        D3; goto URF2; 
  107.         } else if (DRB_D == L) { D2; goto ULF2; 
  108.         }
  109.       } else if (DRB_B == R) {
  110.         if (DRB_D == F) {        D3; goto URF2; 
  111.         } else if (DRB_D == B) { goto URB2; 
  112.         }
  113.       } else if (DRB_B == B) {
  114.         if (DRB_D == R) {        goto URB2;
  115.         } else if (DRB_D == L) { D1; goto ULB2;
  116.         }
  117.       } else if (DRB_B == L) {
  118.         if (DRB_D == F) {        D2; goto ULF2;
  119.         } else if (DRB_D == B) { D1; goto ULB2;
  120.         }
  121.       }
  122.     } else if (DRB_B == U) {
  123.       if (DRB_R == F) {
  124.         if (DRB_D == R) {        D3; goto URF2; 
  125.         } else if (DRB_D == L) { D2; goto ULF2; 
  126.         }
  127.       } else if (DRB_R == R) {
  128.         if (DRB_D == F) {        D3; goto URF2; 
  129.         } else if (DRB_D == B) { goto URB2; 
  130.         }
  131.       } else if (DRB_R == B) {
  132.         if (DRB_D == R) {        goto URB2;
  133.         } else if (DRB_D == L) { D1; goto ULB2;
  134.         }
  135.       } else if (DRB_R == L) {
  136.         if (DRB_D == F) {        D2; goto ULF2;
  137.         } else if (DRB_D == B) { D1; goto ULB2;
  138.         }
  139.       }
  140.     } else if (DRB_D == U) {
  141.       if (DRB_R == F) {
  142.         if (DRB_B == R) {        D3; goto URF2; 
  143.         } else if (DRB_B == L) { D2; goto ULF2; 
  144.         }
  145.       } else if (DRB_R == R) {
  146.         if (DRB_B == F) {        D3; goto URF2; 
  147.         } else if (DRB_B == B) { goto URB2; 
  148.         }
  149.       } else if (DRB_R == B) {
  150.         if (DRB_B == R) {        goto URB2;
  151.         } else if (DRB_B == L) { D1; goto ULB2;
  152.         }
  153.       } else if (DRB_R == L) {
  154.         if (DRB_B == F) {        D2; goto ULF2;
  155.         } else if (DRB_B == B) { D1; goto ULB2;
  156.         }
  157.       }
  158.     }
  159.     goto corner3;
  160. URF2: if (DRF_F == U)        { F1D1F3;
  161.       } else if (DRF_R == U) { R3D3R1;
  162.       } else if (DRF_D == U) { R3D1R1D2R3D3R1;
  163.       } 
  164.       goto corner3;
  165. URB2: if (DRB_R == U)        { R1D1R3;
  166.       } else if (DRB_B == U) { B3D3B1;
  167.       } else if (DRB_D == U) { B3D1B1D2B3D3B1;
  168.       } 
  169.       goto corner3;
  170. ULB2: if (DLB_B == U)        { B1D1B3;
  171.       } else if (DLB_L == U) { L3D3L1;
  172.       } else if (DLB_D == U) { L3D1L1D2L3D3L1;
  173.       }
  174.       goto corner3;
  175. ULF2: if (DLF_L == U)        { L1D1L3;
  176.       } else if (DLF_F == U) { F3D3F1;
  177.       } else if (DLF_D == U) { F3D1F1D2F3D3F1;
  178.       } 
  179. corner3: ;
  180.     if (DLB_B == U) {
  181.       if (DLB_L == F) {
  182.         if (DLB_D == R) {        D2; goto URF3; 
  183.         } else if (DLB_D == L) { D1; goto ULF3; 
  184.         }
  185.       } else if (DLB_L == R) {
  186.         if (DLB_D == F) {        D2; goto URF3; 
  187.         } else if (DLB_D == B) { D3; goto URB3; 
  188.         }
  189.       } else if (DLB_L == B) {
  190.         if (DLB_D == R) {        D3; goto URB3;
  191.         } else if (DLB_D == L) { goto ULB3;
  192.         }
  193.       } else if (DLB_L == L) {
  194.         if (DLB_D == F) {        D1; goto ULF3;
  195.         } else if (DLB_D == B) { goto ULB3;
  196.         }
  197.       }
  198.     } else if (DLB_L == U) {
  199.       if (DLB_B == F) {
  200.         if (DLB_D == R) {        D2; goto URF3; 
  201.         } else if (DLB_D == L) { D1; goto ULF3; 
  202.         }
  203.       } else if (DLB_B == R) {
  204.        if (DLB_D == F) {         D2; goto URF3; 
  205.         } else if (DLB_D == B) { D3; goto URB3; 
  206.         }
  207.       } else if (DLB_B == B) {
  208.         if (DLB_D == R) {        D3; goto URB3;
  209.         } else if (DLB_D == L) { goto ULB3;
  210.         }
  211.       } else if (DLB_B == L) {
  212.         if (DLB_D == F) {        D1; goto ULF3;
  213.         } else if (DLB_D == B) { goto ULB3;
  214.         }
  215.       }
  216.     } else if (DLB_D == U) {
  217.       if (DLB_B == F) {
  218.         if (DLB_L == R) {        D2; goto URF3; 
  219.         } else if (DLB_L == L) { D1; goto ULF3; 
  220.         }
  221.       } else if (DLB_B == R) {
  222.         if (DLB_L == F) {        D2; goto URF3; 
  223.         } else if (DLB_L == B) { D3; goto URB3; 
  224.         }
  225.       } else if (DLB_B == B) {
  226.         if (DLB_L == R) {        D3; goto URB3;
  227.         } else if (DLB_L == L) { goto ULB3;
  228.         }
  229.       } else if (DLB_B == L) {
  230.         if (DLB_L == F) {        D1; goto ULF3;
  231.         } else if (DLB_L == B) { goto ULB3;
  232.         }
  233.       }
  234.     }
  235.     goto corner4;
  236. URF3: if (DRF_F == U)        { F1D1F3;
  237.       } else if (DRF_R == U) { R3D3R1;
  238.       } else if (DRF_D == U) { R3D1R1D2R3D3R1;
  239.       } 
  240.       goto corner4;
  241. URB3: if (DRB_R == U)        { R1D1R3;
  242.       } else if (DRB_B == U) { B3D3B1;
  243.       } else if (DRB_D == U) { B3D1B1D2B3D3B1;
  244.       } 
  245.       goto corner4;
  246. ULB3: if (DLB_B == U)        { B1D1B3;
  247.       } else if (DLB_L == U) { L3D3L1;
  248.       } else if (DLB_D == U) { L3D1L1D2L3D3L1;
  249.       }
  250.       goto corner4;
  251. ULF3: if (DLF_L == U)        { L1D1L3;
  252.       } else if (DLF_F == U) { F3D3F1;
  253.       } else if (DLF_D == U) { F3D1F1D2F3D3F1;
  254.       } 
  255. corner4: ;
  256.     if (DLF_L == U) {
  257.       if (DLF_F == F) {
  258.         if (DLF_D == R) {        D1; goto URF4; 
  259.         } else if (DLF_D == L) { goto ULF4; 
  260.         }
  261.       } else if (DLF_F == R) {
  262.         if (DLF_D == F) {        D1; goto URF4; 
  263.         } else if (DLF_D == B) { D2; goto URB4; 
  264.         }
  265.       } else if (DLF_F == B) {
  266.         if (DLF_D == R) {        D2; goto URB4;
  267.         } else if (DLF_D == L) { D3; goto ULB4;
  268.         }
  269.       } else if (DLF_F == L) {
  270.         if (DLF_D == F) {        goto ULF4;
  271.         } else if (DLF_D == B) { D3; goto ULB4;
  272.         }
  273.       }
  274.     } else if (DLF_F == U) {
  275.       if (DLF_L == F) {
  276.         if (DLF_D == R) {        D1; goto URF4; 
  277.         } else if (DLF_D == L) { goto ULF4; 
  278.         }
  279.       } else if (DLF_L == R) {
  280.         if (DLF_D == F) {        D1; goto URF4; 
  281.         } else if (DLF_D == B) { D2; goto URB4; 
  282.         }
  283.       } else if (DLF_L == B) {
  284.         if (DLF_D == R) {        D2; goto URB4;
  285.         } else if (DLF_D == L) { D3; goto ULB4;
  286.         }
  287.       } else if (DLF_L == L) {
  288.         if (DLF_D == F) {        goto ULF4;
  289.         } else if (DLF_D == B) { D3; goto ULB4;
  290.         }
  291.       }
  292.     } else if (DLF_D == U) {
  293.       if (DLF_L == F) {
  294.         if (DLF_F == R) {        D1; goto URF4; 
  295.         } else if (DLF_F == L) { goto ULF4; 
  296.         }
  297.       } else if (DLF_L == R) {
  298.         if (DLF_F == F) {        D1; goto URF4; 
  299.         } else if (DLF_F == B) { D2;  goto URB4; 
  300.         }
  301.       } else if (DLF_L == B) {
  302.         if (DLF_F == R) {        D2; goto URB4;
  303.         } else if (DLF_F == L) { D3; goto ULB4;
  304.         }
  305.       } else if (DLF_L == L) {
  306.         if (DLF_F == F) {        goto ULF4;
  307.         } else if (DLF_F == B) { D3; goto ULB4;
  308.         }
  309.       }
  310.     }
  311.     goto cornerDone;
  312. URF4: if (DRF_F == U)        { F1D1F3;
  313.       } else if (DRF_R == U) { R3D3R1;
  314.       } else if (DRF_D == U) { R3D1R1D2R3D3R1;
  315.       } 
  316.       goto cornerDone;
  317. URB4: if (DRB_R == U)        { R1D1R3;
  318.       } else if (DRB_B == U) { B3D3B1;
  319.       } else if (DRB_D == U) { B3D1B1D2B3D3B1;
  320.       } 
  321.       goto cornerDone;
  322. ULB4: if (DLB_B == U)        { B1D1B3;
  323.       } else if (DLB_L == U) { L3D3L1;
  324.       } else if (DLB_D == U) { L3D1L1D2L3D3L1;
  325.       }
  326.       goto cornerDone;
  327. ULF4: if (DLF_L == U)        { L1D1L3;
  328.       } else if (DLF_F == U) { F3D3F1;
  329.       } else if (DLF_D == U) { F3D1F1D2F3D3F1;
  330.       } 
  331. cornerDone: ;
  332. /*
  333.  * Exit if all 4 of the corner cubes in the top row are in
  334.  * the correct position and orientation.
  335.  */
  336.     if (ULF_U==U && URF_U==U && ULB_U==U && URB_U==U &&
  337.         ULF_F==F && URF_F==F && URF_R==R && URB_R==R &&
  338.         ULB_B==B && URB_B==B && ULF_L==L && ULB_L==L)
  339.           break;
  340. /*
  341.  * Move an incorrectly oriented corner cube in the top row
  342.  * down into the bottom row
  343.  */
  344.     if        ((URF_U == U || URF_F == U || URF_R == U) &&
  345.                (URF_U != U || URF_F != F || URF_R != R)) {
  346.           R3D1R1;
  347.     } else if ((URB_U == U || URB_R == U || URB_B == U) &&
  348.                (URB_U != U || URB_R != R || URB_B != B)) {
  349.           B3D1B1;
  350.     } else if ((ULB_U == U || ULB_B == U || ULB_L == U) &&
  351.                (ULB_U != U || ULB_B != B || ULB_L != L)) {
  352.           L3D1L1;
  353.     } else if ((ULF_U == U || ULF_L == U || ULF_F == U) &&
  354.                (ULF_U != U || ULF_L != L || ULF_F != F)) {
  355.           F3D1F1;
  356.     }
  357.   } while (true);
  358.   return (true);
  359. }